﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PSE.Framework.Communication.Adapters;
using PSE.Framework.Communication.Messages;

namespace PSE.Framework.Communication.Client
{
    /// <summary>
    /// Classe base dos clients de entrada síncronos
    /// </summary>
    /// <typeparam name="TOpenParameter">Tipo do parâmetro de abertura do processo</typeparam>
    /// <typeparam name="TReceiveParameter">Tipo do parâmetro de recebimento das mensagens</typeparam>
    public abstract class SyncInputClient<TOpenParameter, TReceiveParameter> : BaseInputClient<TOpenParameter>
        where TOpenParameter : class
        where TReceiveParameter : class
    {
        #region Construtores
        /// <summary>
        /// Construtor padrão
        /// </summary>
        public SyncInputClient()
            : base()
        {
        }
        #endregion

        #region Adapter
        /// <summary>
        /// Adapter encapsulado pelo client
        /// </summary>
        protected new ISyncInputAdapter Adapter
        {
            get { return (ISyncInputAdapter)base.Adapter; }
        }
        #endregion

        #region Receive
        /// <summary>
        /// Recebe uma mensagem de forma síncrona
        /// </summary>
        /// <returns>Retorna objeto contendo a Action e a Mensagem</returns>
        public MessageInfo Receive()
        {
            this.VerifyIsOpened();

            return this.Adapter.Receive();
        }

        /// <summary>
        /// Recebe uma mensagem de forma síncrona
        /// </summary>
        /// <param name="parameter">Parâmetro de recebimento das mensagens</param>
        /// <returns>Retorna objeto contendo a Action e a Mensagem</returns>
        public MessageInfo Receive(TReceiveParameter parameter)
        {
            this.VerifyIsOpened();

            return this.Adapter.Receive(parameter);
        }
        #endregion
    }
}
